import dayjs from 'dayjs'
import express from 'express'
import md5 from 'md5'
const router = express.Router()

router.get('/out/browser-cache/control-cache', (req, res) => {
    console.log('接收到了请求 control-cache')
    res.setHeader('Cache-Control', 'public, max-age=5') // 设置缓存时间为5秒
    res.setHeader('Expires', new Date(Date.now() + 10 * 1000).toUTCString()) // 设置缓存过期时间 10秒后
    setTimeout(() => {
        res.send('control-cache 返回数据')
    }, 500)
})

router.get('/out/browser-cache/expires', (req, res) => {
    console.log('接收到了请求 expires')
    setTimeout(() => {
        res.setHeader('Expires', new Date(Date.now() + 5 * 1000).toUTCString()) // 设置缓存过期时间 5秒后
        res.send('expires 返回数据')
    }, 500)
})

router.get('/out/browser-cache/Etag', (req, res) => {
    console.log('接收到了请求 Etag')
    // 生成 ETag （Etag 值通常是基于资源内容生成的散列值）
    // 这里为了测试，直接返回一个固定的值
    const resourceETag = md5('1234567890')
    // 检查客户端发送的 If-None-Match 头部字段
    const requestEtag = req.headers['if-none-match']
    // 如果服务端的 ETag 和 客户端的 If-None-Match 头部字段匹配，则表示资源未修改，返回 304 状态码
    if(requestEtag === resourceETag) {
        // 设置响应状态码为 304，表示请求的资源未修改，可以直接使用客户端缓存的版本
        res.status(304).send('304 资源未修改')
    } else {
        setTimeout(() => {
            res.setHeader('ETag', resourceETag) // 设置缓存标识
            // 将 ETag 暴露给前端
            res.setHeader("Access-Control-Expose-Headers", "ETag, If-None-Match")
            res.send(`${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')} etag 返回数据`)
        }, 500)
    }
})

// 模拟缓存 last-modified
// 最后一次修改时间
const lastModified = `${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')}`
router.get('/out/browser-cache/last-modified', (req, res) => {
    console.log('接收到了请求 last-modified')
    const ifModifiedSince = req.headers['if-modified-since']
    if(lastModified === ifModifiedSince) {
        // 设置响应状态码为 304，表示请求的资源未修改，可以直接使用客户端缓存的版本
        res.status(304).send('304 资源未修改')
    } else {
        setTimeout(() => {
            // 设置最后一次修改的时间
            res.setHeader('Last-Modified', lastModified) 
            res.send(`${dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')} last-modified 返回数据`)
        }, 500)
    }
})

export default router